// aim 下载文件的信息

package internal

import (
	"net/http"
	"net/url"
	"path"
	"strings"
	"time"
)

type Aim struct {
	fileUrl      string
	fileName     string // 文件名
	fileSize     int64  // 文件大小
	fileNameOnly string // 仅仅文件名（无后缀）
	fileSuffix   string // 文件后缀
}

func NewAim(originPath string) (*Aim, error) {
	_, err := url.ParseRequestURI(originPath)
	if err != nil {
		return nil, err
	}

	// 获取文件名
	filename := path.Base(originPath)

	a := &Aim{
		fileName: filename,
		fileUrl:  originPath,
	}
	a.setFileSuffixAndFileNameOnly()

	// 获取文件大小
	fileSize, err := a.getSize()
	if err != nil {
		return nil, err
	}

	a.fileSize = fileSize

	return a, nil
}

// 获取文件大小
func (a *Aim) getSize() (int64, error) {
	client := http.DefaultClient
	client.Timeout = 10 * time.Second

	rsp, err := client.Get(a.fileUrl)
	if err != nil {
		return 0, err
	}

	defer rsp.Body.Close()

	return rsp.ContentLength, nil
}

// 获取文件名和文件后缀
func (a *Aim) setFileSuffixAndFileNameOnly() {
	a.fileSuffix = path.Ext(a.fileName)
	a.fileNameOnly = strings.TrimSuffix(a.fileName, a.fileSuffix)
}
